﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace MyVideoTek
{
    class Film : SqliteData
    {
        #region Attributs
        private int idFilm;
        private string titreFilm;
        private string description;
        private string afficheFilm;
        private string afficheFilmAllocine;
        private List<GenreMv> lesGenres;
        private List<Fichier> lesFichiers;
        private int dateRealisationFilm;
        private int vue;
        #endregion

        #region Constrcuteur
        public Film(string titre, string synopsis = null, string affiche = null, string afficheAllocine = null, List<GenreMv> genres = null, string dateRea = null, int unIdFilm = 0) 
        {
            lesGenres = new List<GenreMv>();
            lesFichiers = new List<Fichier>();
            
            //Echappement
            titre = Regex.Replace(titre, "(%20)", " ");
            titre = titre.ToLower();

            //Affectation
            titreFilm = titre;
            description = synopsis;
            afficheFilm = affiche;
            afficheFilmAllocine = afficheAllocine;
            idFilm = unIdFilm;

            if (genres != null) {
                lesGenres = genres;
            }
            dateRealisationFilm = Convert.ToInt32(dateRea);

            if (idFilm >= 0) {
                //Le film est déjà présent
                if (VerifDoublon()) {
                    //Recupère un film
                    GetFilmByName();
                }
                //Insertion
                else {
                    InsertFilm();
                }
            }
            else {
                GetFilmById();
            }
        }
        #endregion

        #region Insertion Film BDD
        public void InsertFilm()
        {
            //Si le film est pas déjà présent
            if (!VerifDoublon())
            {
                //Initialisation de l'id 
                idFilm = maxId();

                //Requete insertion Film
                string maRequete = "INSERT INTO film(id_film, titre_film, synopsis_film, anne_film, affiche_film, affiche_allocine, vue_film) VALUES(" +
                            "@idFilm , @titreFilm, @description, @dateRealisationFilm, @afficheFilm, @afficheFilmAllocine, 0)";
                
                SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);

                //Création de la commande SQL 
                SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

                //Création et décalartion des paramètres 
                myCommand.Parameters.Add(new SQLiteParameter("@idFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@titreFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@description"));
                myCommand.Parameters.Add(new SQLiteParameter("@dateRealisationFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@afficheFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@afficheFilmAllocine"));

                //Attribution des valeurs aux paramètres 
                myCommand.Parameters["@idFilm"].Value = Convert.ToInt32(idFilm);
                myCommand.Parameters["@titreFilm"].Value = titreFilm;
                myCommand.Parameters["@description"].Value = description;
                myCommand.Parameters["@dateRealisationFilm"].Value = Convert.ToInt32(dateRealisationFilm);
                myCommand.Parameters["@afficheFilm"].Value = afficheFilm;
                myCommand.Parameters["@afficheFilmAllocine"].Value = afficheFilmAllocine;

                //Tente d'inserer un film
                try
                {
                    //Execution de la requête 
                    myCommand.Connection.Open();
                    myCommand.ExecuteNonQuery();
                    myCommand.Connection.Dispose();
                }
                catch (SqlException ex)
                {
                    //Message d'erreur
                    MessageBox.Show(ex.Message);
                }

                //Insertion des genre du Film
                InsertGenre();
            }
        }
        #endregion

        #region Mise à jour Film
        public void UpdateFilm()
        {
            //Si le film est pas déjà présent
            if (!VerifDoublon())
            {
                //Initialisation
                idFilm = maxId();

                //Requete insertion Film
                string maRequete = "UpdateFilm film SET titre_film = @titreFilm SET synopsis_film = @description SET anne_film = @dateRealisationFilm " +
                                        "SET affiche_film = @afficheFilm SET affiche_allocine = @afficheFilmAllocine SET vue = 0)";

                SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);

                //Création de la commande SQL 
                SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

                //Création et décalartion des paramètres 
                myCommand.Parameters.Add(new SQLiteParameter("@idFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@titreFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@description"));
                myCommand.Parameters.Add(new SQLiteParameter("@dateRealisationFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@afficheFilm"));
                myCommand.Parameters.Add(new SQLiteParameter("@afficheFilmAllocine"));

                //Attribution des valeurs aux paramètres 
                myCommand.Parameters["@idFilm"].Value = Convert.ToInt32(idFilm);
                myCommand.Parameters["@titreFilm"].Value = titreFilm;
                myCommand.Parameters["@description"].Value = description;
                myCommand.Parameters["@dateRealisationFilm"].Value = Convert.ToInt32(dateRealisationFilm);
                myCommand.Parameters["@afficheFilm"].Value = afficheFilm;
                myCommand.Parameters["@afficheFilmAllocine"].Value = afficheFilmAllocine;

                //Tente d'inserer un film
                try
                {
                    //Execution de la requête 
                    myCommand.Connection.Open();
                    myCommand.ExecuteNonQuery();
                    myCommand.Connection.Dispose();
                }
                catch (SqlException ex)
                {
                    //Message d'erreur
                    MessageBox.Show(ex.Message);
                }

                //Insertion des genre du Film
                InsertGenre();
            }
        }
        #endregion

        #region Supprime Film
        public void DeleteFilm()
        {
            //Requete insertion Film
            string maRequete = "DELETE FROM film, fichier, idgenre WHERE id_film = @idFilm";

            SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);

            //Création de la commande SQL 
            SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

            //Création et décalartion des paramètres 
            myCommand.Parameters.Add(new SQLiteParameter("@idFilm"));

            //Attribution des valeurs aux paramètres 
            myCommand.Parameters["@idFilm"].Value = this.idFilm;

            //Tente d'inserer un film
            try
            {
                //Execution de la requête 
                myCommand.Connection.Open();
                myCommand.ExecuteNonQuery();
                myCommand.Connection.Dispose();
            }
            catch (SqlException ex)
            {
                //Message d'erreur
                MessageBox.Show(ex.Message);
            }
        }
        #endregion

        #region Insertion Genre BDD
        private void InsertGenre()
        {
            //Parcours des genres
            foreach (GenreMv unGenre in lesGenres)
            {
                GenreFilm GenreFilm = new GenreFilm(unGenre.IdGenre, idFilm); 
            }
        }
        #endregion

        #region Verif Doublon
        public bool VerifDoublon()
        {
            bool result = false;

            //Requete
            string maRequete = "SELECT * FROM film WHERE titre_film = @unTitreFilm";

            //Création de la commande SQL 
            SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);
            SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

            myCommand.Parameters.Add(new SQLiteParameter("@unTitreFilm"));

            //Attribution des valeurs aux paramètres 
            myCommand.Parameters["@unTitreFilm"].Value = titreFilm;

            SQLiteDataReader resultReader = null;

            //Tente d'inserer un film
            try
            {
                //Execution de la requête 
                myCommand.Connection.Open();
                resultReader = myCommand.ExecuteReader();

            }
            catch (SqlException ex)
            {
                //Message d'erreur
                MessageBox.Show(ex.Message);
            }

            //True s'il y a doublon
            result = resultReader.HasRows;

            //Ferme la connexion
            myCommand.Connection.Close();
            return result;
        }
        #endregion

        #region Récupére un film par son Titre
        public void GetFilmByName()
        {
            string maRequete = "SELECT * FROM film WHERE titre_film = @unTitreFilm";

            SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);

            //Création de la commande SQL 
            SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

            myCommand.Parameters.Add(new SQLiteParameter("@unTitreFilm"));

            //Attribution des valeurs aux paramètres 
            myCommand.Parameters["@unTitreFilm"].Value = titreFilm;

            SQLiteDataReader resultReader = null;

            //Tente d'inserer un film
            try
            {
                //Execution de la requête 
                myCommand.Connection.Open();
                resultReader = myCommand.ExecuteReader();

            }
            catch (SqlException ex)
            {
                //Message d'erreur
                MessageBox.Show(ex.Message);
            }


            while (resultReader.Read())
            {
                idFilm = Convert.ToInt32(resultReader["id_film"].ToString());
                titreFilm = resultReader["titre_film"].ToString();
                description = resultReader["synopsis_film"].ToString();
                dateRealisationFilm = Convert.ToInt32(resultReader["anne_film"].ToString());
                afficheFilm = resultReader["affiche_film"].ToString();
                afficheFilmAllocine = resultReader["affiche_allocine"].ToString();
                vue = Convert.ToInt32(resultReader["vue_film"].ToString());
            }

            myCommand.Connection.Dispose();

            //Recupère les genres
            GetListGenre();
        }
        #endregion

        #region Recupère un ID de film via son nom
        public void GetFilmById()
        {
            //Requete
            string maRequete = "SELECT * FROM film WHERE id_film = @idFilm";

            //Création de la commande SQL 
            SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);
            SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

            //Paramètre de la requete
            myCommand.Parameters.Add(new SQLiteParameter("@idFilm"));
            myCommand.Parameters["@idFilm"].Value = idFilm;

            SQLiteDataReader resultReader = null;

            //Tente d'exécuter la requete
            try
            {
                //Execution de la requête 
                myCommand.Connection.Open();
                resultReader = myCommand.ExecuteReader();
            }
            catch (SqlException ex)
            {
                //Message d'erreur
                MessageBox.Show(ex.Message);
            }

            //Parcours les résultats et les assignes
            while (resultReader.Read())
            {
                idFilm = Convert.ToInt32(resultReader["id_film"].ToString());
                titreFilm = resultReader["titre_film"].ToString();
                description = resultReader["synopsis_film"].ToString();
                dateRealisationFilm = Convert.ToInt32(resultReader["anne_film"].ToString());
                afficheFilm = resultReader["affiche_film"].ToString();
                afficheFilmAllocine = resultReader["affiche_allocine"].ToString();
                vue = Convert.ToInt32(resultReader["vue_film"].ToString());
            }

            //Libère la mémoire
            myCommand.Connection.Dispose();

            //Recupère les genres
            GetListGenre();
        }
        #endregion

        #region Recupère tous les genres d'un film
        private void GetListGenre()
        {
            //Connection à la base de donnée
            SqliteData db = new SqliteData();
            DataTable resultTable = db.Select("SELECT * FROM idgenre, genre WHERE idgenre.id_genre = genre.id_genre AND id_film = '" + idFilm + "'");

            //Parcours des resultats ( qu'une seule ligne )
            foreach (DataRow row in resultTable.Rows)
            {
                GenreMv unGenre = new GenreMv(row["nom_genre"].ToString());
                lesGenres.Add(unGenre);
            }
        }
        #endregion

        #region Recupère la liste des genre et la retourne en une chaine de caractère
        public string GetStringListGenre()
        {
            string listeDesGenres = null;

            //Parcours des genres
            foreach (GenreMv unGenre in lesGenres)
            {
                listeDesGenres = listeDesGenres + unGenre.NomGenre + ", ";
            }

            return listeDesGenres;
        }
        #endregion

        #region Recupère l'id max + 1
        private int maxId()
        {
            //Connection à la base de donnée
            SqliteData db = new SqliteData();

            DataTable resultTable = db.Select("SELECT max(id_film)+1 FROM film");

            //Recupère la ligne de resultat
            DataRow row = resultTable.Rows[0];

            //S'il y a rien, c'est qu'il y a aucun enregistrement docn on commence l'incrémente à 1
            if (row[0].ToString() == "")
            {
                return 1;
              
            }
            else
            {
                return Convert.ToInt32(row[0].ToString());
            }
        }
        #endregion

        #region Accesseurs
        public int IdFilm
        {
            get { return idFilm; }
        }

        public string TitreFilm
        {
            get { return titreFilm; }
        }

        public string Description
        {
            get { return description; }
        }

        public string AfficheFilm
        {
            get { return afficheFilm; }
        }

        public string AfficheFilmAllocine
        {
            get { return afficheFilmAllocine; }
        }

        public List<GenreMv> LesGenres
        {
            get { return lesGenres; }
        }

        public List<Fichier> LesFichiers
        {
            get { return lesFichiers; }
        }

        public int DateRealisationFilm
        {
            get { return dateRealisationFilm; }
        }
        #endregion
    }
}
